package com.unitechs.commons.utils;

import org.apache.commons.io.IOUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.servlet.http.HttpServletResponse;
import java.io.*;

//TODO 开发中
public final class ZyucFilePreviewUtil {
    private ZyucFilePreviewUtil() {
        //防止实例化
        throw new AssertionError();
    }

    public static void previewFile(HttpServletResponse response, File file) {
        try {
            String contentType = determineContentType(file.getName());

            if (contentType != null) {
                response.setContentType(contentType);

                try (OutputStream out = response.getOutputStream();
                     FileInputStream fis = new FileInputStream(file)) {
                    // 根据文件类型选择合适的处理方式
                    switch (contentType) {
                        case "application/xml":
                        case "text/xml":
                            // 预览 XML 文件
                            previewXml(fis, out);
                            break;
                        case "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":
                            // 预览 Excel 文件
                            previewExcel(fis, out);
                            break;
                        case "application/pdf":
                            // 预览 PDF 文件
                            previewPdf(fis, out);
                            break;
                        case "text/html":
                            // 预览 HTML 文件
                            previewHtml(fis, out);
                            break;
                        case "application/msword":
                        case "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
                            // 预览 Word 文件
                            previewWord(fis, out);
                            break;
                        default:
                            // 其他文件类型的处理方式
                            response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());
                            IOUtils.copy(fis, out);
                            break;
                    }
                }
            } else {
                response.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, "Unsupported file type");
            }
        } catch (IOException e) {
            e.printStackTrace(); // 在实际应用中，应该根据需要处理异常
        }
    }

    private static String determineContentType(String fileName) {
        // 根据文件名或其他方式判断文件类型，返回对应的 MIME 类型
        // 这里简单地根据文件名后缀进行判断
        if (fileName.toLowerCase().endsWith(".xml")) {
            return "application/xml";
        } else if (fileName.toLowerCase().endsWith(".xlsx")) {
            return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        } else if (fileName.toLowerCase().endsWith(".pdf")) {
            return "application/pdf";
        } else if (fileName.toLowerCase().endsWith(".html") || fileName.toLowerCase().endsWith(".htm")) {
            return "text/html";
        } else if (fileName.toLowerCase().endsWith(".doc") || fileName.toLowerCase().endsWith(".docx")) {
            return "application/msword";
        }
        // TODO: 可根据需要添加更多文件类型的判断

        return null;
    }

    private static void previewXml(InputStream inputStream, OutputStream outputStream) throws IOException {
        // 在实际应用中，可能需要使用 XML 解析库，将 XML 内容转换为 HTML 或其他格式进行预览
        // 这里简单地将 XML 内容输出到响应流中
        IOUtils.copy(inputStream, outputStream);
    }

    private static void previewExcel(InputStream inputStream, OutputStream outputStream) throws IOException {
        // 使用 Apache POI 处理 Excel 文件
        Workbook workbook = new XSSFWorkbook(inputStream);
        workbook.write(outputStream);
    }

    private static void previewPdf(InputStream inputStream, OutputStream outputStream) throws IOException {
        // 使用 PDF.js 在线预览 PDF 文件
        // 注意：PDF.js 需要与前端页面结合使用，这里只是简单示范
        // 在实际应用中，需要在前端页面引入 PDF.js，并配置相应的展示方式
        // 参考：https://mozilla.github.io/pdf.js/getting_started/
        IOUtils.copy(inputStream, outputStream);
    }

    private static void previewHtml(InputStream inputStream, OutputStream outputStream) throws IOException {
        // 直接输出 HTML 内容到响应流中
        IOUtils.copy(inputStream, outputStream);
    }

    private static void previewWord(InputStream inputStream, OutputStream outputStream) throws IOException {
        // 使用 Apache POI 处理 Word 文件
        // 注意：处理 Word 文件的方式相对较复杂，这里只是简单示范
        // 在实际应用中，可能需要使用更专业的工具库
        IOUtils.copy(inputStream, outputStream);
    }
}
